de cara o erro q se enxerga é vc utilizando a função isPlayer(uid) sem o parâmetro.. vc quer verificar se o inimigo é um player?
outra coisa.. setPlayerStorageValue(#inimigo, storage, 1) isso daqui não existe pois #inimigo retorna o numero de elementos numa tabela.
Erro em script (sem erro no distro)
Por Darkraus, 17 de fev. de 2016 em Scripts
info
Grupo: Herói
Registrado: 14/02/14
Posts: 341
Reputação: +285
Gênero: Masculino
Char no Tibia: Night Wolf

não entendi bem o paramentro do isPlayer...
já a parte do #inimigo, eu procurei alguma forma de armazenar um dado no script pra usar no addevents,
pq se eu usasse getCreatureTarget(cid) no addevents se o player mudasse o target poderia gerar algum bug...
na verdade pode ter sido uma interpretação completamente errônea de um script q eu vi na seção de pedidos que inclusive é seu.
mas nele vc usava table.insert para que o script memorizasse uma posição...
se essa forma não funciona, qual outra forma eu poderia usar para que o player que recebeu a spell fosse memorizado no script podendo ser usado novamente?
info
Grupo: Herói
Registrado: 14/02/14
Posts: 341
Reputação: +285
Gênero: Masculino
Char no Tibia: Night Wolf

olha, vc não pode usar cid até ele ser declarado e ele só é declarado depois de function onCastSpell.. então nada disso daqui vai funcionar:
isCreature/isPlayer/isMonster verificam se determinado uid é criatura/player/monstro.. o parâmetro é o uid.
Pra quem executa os callbacks, nós chamamos o uid de cid, mas pode ser muito bem isPlayer(getCreatureTarget(cid).uid)
-- verifica se assim funciona.. vc só tem que colocar target = "1" na tag do spells.xml
variantToNumber(var) representa o target.
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -2, -1, -3, -2) local escudo = 2520 local storage = 199901 function onCastSpell(cid, var) if isPlayer(variantToNumber(var)) then local slot1 = getPlayerSlotItem(variantToNumber(var), 5) local slot2 = getPlayerSlotItem(variantToNumber(var), 6) if slot1 or slot2 == escudo then setPlayerStorageValue(variantToNumber(var), storage, 1) doSendAnimatedText(getCreaturePosition(cid), 'Charged', 180) end addEvent(function() if isCreature(cid) then setPlayerStorageValue(variantToNumber(var), storage, 0) doSendAnimatedText(getCreaturePosition(cid), 'Charge lost', 180) end end,4000) end return doCombat(cid, combat, var) end
Poderia me explicar brevemente o que variantToNumber(var) faz exatamente?
porque eu fiz aquela tentativa porque se o player TROCAR o target no tempo do addevents ele poderia usar o target novo para remover o storage
fazendo com que o player anterior que recebeu o storage ficasse com ele pra sempre... configurando um bug.
mas eu não conheço nem de nome essa variantToNumber(var).
ficaria grato se pudesse me explicar.
olha, vc não pode usar cid até ele ser declarado e ele só é declarado depois de function onCastSpell.. então nada disso daqui vai funcionar:
local slot1 = getPlayerSlotItem(getCreatureTarget(cid), 5)local slot2 = getPlayerSlotItem(getCreatureTarget(cid), 6)
de qualquer forma, essas poucas palavras já valeram o topico. algo que eu não sabia e provavelmente nunca ia desconfiar.
info
Grupo: Herói
Registrado: 14/02/14
Posts: 341
Reputação: +285
Gênero: Masculino
Char no Tibia: Night Wolf

eu tinha explicado ali:
variantToNumber(var) representa o target.
----- o var da spell pode me retornar o uid do target através dessa função variantToNumber(var)
Tem algumas discussões sobre isso aqui no xt, só procurar o tópico do @@Skulls
Editado Fevereiro 17 por Night Wolf
hm, achei q ela se adequaria a essa função somente nesse scrit e semelhantes.
mas se é a função dela, é um otimo elemento no arsenal haha.
já dei rep em todos as respostas aqui, muito obrigado pela atenção e suporte ![]()
-edit
uma duvida rapida: qual distro você prefere programar? notei que a maioria dos scripters usam a 0.3.6 do tfs porém, ela parece bem limitada em relação ao 1.2... fico em duvida em relação a isso.
Editado Fevereiro 17 por Darkraus
info
Grupo: Herói
Registrado: 14/02/14
Posts: 341
Reputação: +285
Gênero: Masculino
Char no Tibia: Night Wolf

quanto mais atual, mais recursos.. porém TFS 1.2 é MUITO diferente de 0.36... eu uso aqui em casa dois servidores (0.36 e 0.4)
Wolf, sem querer abusar da sua pessoa, se ainda estiver acompanhando este topico, poderia me esclarecer uma duvida?
seguinte :
quando uso a função onStatsChange
(cid, attacker, type, combat, value)
a função possui o parametro "attacker", este parametro pode ser usado posteriormente em algums funções no lugar do cid?
ou possui outra forma de vc declarar quem ataca o player?
info
Grupo: Herói
Registrado: 14/02/14
Posts: 341
Reputação: +285
Gênero: Masculino
Char no Tibia: Night Wolf

vc pode usar no lugar do cid pra fazer a função para quem te ataca, só lembra de dar if isCreature(attacker) pra checar se o attacker não é um uid de fire field por exemplo, porque esse callback é executado toda vez que o player tem vida/mana mudados. Aí é recomendável vc tb verificar o type pra garantir que seu código só vai executar em casos específicos (qnd perder vida ou mana, por ex)
Editado Fevereiro 18 por Night Wolf
hm, se eu entendi bem... isso funcionaria :
if isCreature(attacker) then
doSendMagicEffect(getCreaturePosition(attacker), 9)
doAddCondition(attacker, venom)
end
certo?
verificar se o "atacante" é criatura, verificar a posição do atacante e até mesmo adicionar uma condição ao atacante.
desde claro que a função onStatsChange seja declarada antes, correto?
info
Grupo: Herói
Registrado: 14/02/14
Posts: 341
Reputação: +285
Gênero: Masculino
Char no Tibia: Night Wolf

sim, e vc tem que criar a condition venom tb.. da mesma forma q vc cria em spells
info
Grupo: Conde
Registrado: 07/04/15
Posts: 962
Reputação: +258
Gênero: Masculino

Tópico Movido
Este tópico foi movido de "OTServ → Scripting → Suporte Scripting"
para "OTServ → Scripting → Suporte Scripting → Pedidos e dúvidas resolvidos - Scripting".




info
Grupo: Campones
Registrado: 28/03/13
Posts: 41
Reputação: +2
Bom dia/tarde/noite.
pra ser direto ao ponto... Eu tive uma ideia de um sistema muito interessante para meu servidor.
após algum tempo estudando formas de faze-lo eu descobri uma forma (bem feia) de fazer.
Após algum tempo trabalhando no script cheguei a um resultado... porém não funcional vejamos:
Primeiro a ideia: esse script ,era pra ser bem simples, seria uma skill target que quando atingisse o inimigo deixaria nele um storage value por determinado tempo.
sairia um texto animado por puro capricho. passado o tempo esse storage value seria removido e sairia outro texto animado.
Esse sistema que pretendo fazer funcionaria somente se o player tivesse equipado com um item, mas tornou-se muito mais problematico do que eu imaginava.
vou postar os 2 pois acredito que o erro seja o mesmo então... não muda muito haha.
Verifica se X item está equipado:
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -2, -1, -3, -2) local inimigo = {} local escudo = 2520 local slot1 = getPlayerSlotItem(getCreatureTarget(cid), 5) local slot2 = getPlayerSlotItem(getCreatureTarget(cid), 6) local storage = 199901 function onCastSpell(cid, var) table.insert(inimigo, getCreatureTarget(cid)) if isPlayer then if slot1 or slot2 == 2520 then setPlayerStorageValue(#inimigo, storage, 1) doSendAnimatedText(getCreaturePosition(cid), 'Charged', 180) else return doCombat(cid, combar, var) end addEvent(function() if isCreature(cid) then setPlayerStorageValue(#inimigo, storage, 0) doSendAnimatedText(getCreaturePosition(cid), 'Charge lost', 180) end end,4000) return doCombat(cid, combat, var) end endNão verifica se item está equipado:
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA) setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -2, -1, -3, -2) local inimigo = {} local storage = 199901 function onCastSpell(cid, var) table.insert(inimigo, getCreatureTarget(cid)) if isPlayer then setPlayerStorageValue(#inimigo, storage, 1) doSendAnimatedText(getCreaturePosition(cid), 'Charged', 180) else return doCombat(cid, combat, var) end addEvent(function() if isCreature(cid) then setPlayerStorageValue(#inimigo, storage, 0) doSendAnimatedText(getCreaturePosition(cid), 'Charge lost', 180) end end,4000) return doCombat(cid, combat, var) endO que me intriga muito nos 2 scripts é o fato de não ter nenhum erro no debugger (OtScriptLive) e nem no distro do servidor.
o unico erro aparente é quano o player usa que aparece o erro avisando que o player está sem mana...
porém baixei o custo de mana da magia pra 0 e testei em 2 personagens com mais de 5k de mana...
eu sou um scripter iniciante (MUITO iniciante... NOVATO... NEWBA) portanto deve ser um erro ridiculo...
alguem tem alguma solução? haha